﻿// ATLSimpleObject.h: CATLSimpleObject 的声明

#pragma once
#include "resource.h"       // 主符号



#include "ATL_i.h"



#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”，原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif

using namespace ATL;


// CATLSimpleObject

class ATL_NO_VTABLE CATLSimpleObject :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CATLSimpleObject, &CLSID_ATLSimpleObject>,
    public IDispatchImpl<IATLSimpleObject, &IID_IATLSimpleObject, &LIBID_ATLLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CATLSimpleObject()
    {
    }

    DECLARE_REGISTRY_RESOURCEID(106)

    //
    //  public: 
    //      typedef x _ComMapClass; 
    //      static HRESULT WINAPI _Cache(
    //          _In_ void* pv, _In_ REFIID iid, 
    //          _COM_Outptr_result_maybenull_ void** ppvObject, 
    //          _In_ DWORD_PTR dw
    //      ) throw()
    //      {
    //          _ComMapClass* p = (_ComMapClass*)pv;
    //          p->Lock();
    //          HRESULT hRes = E_FAIL; 
    //          __try 
    //          { 
    //              hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw);
    //          } 
    //          __finally 
    //          { 
    //              p->Unlock();
    //          } 
    //          return hRes;
    //      }
    //
    //      IUnknown* _GetRawUnknown() throw() 
    //      { 
    //          ATLASSERT(_GetEntries()[0].pFunc == _ATL_SIMPLEMAPENTRY); 
    //          return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); 
    //      } 
    //
    //      IUnknown* GetUnknown() throw() {return _GetRawUnknown();}
    //
    //      HRESULT _InternalQueryInterface( 
    //          _In_ REFIID iid, 
    //          _COM_Outptr_ void** ppvObject) throw() 
    //      { 
    //          return this->InternalQueryInterface(this, _GetEntries(), iid, ppvObject); 
    //      } 
    //
    //      const static ATL::_ATL_INTMAP_ENTRY* WINAPI _GetEntries() throw() 
    //      { 
    //          static const ATL::_ATL_INTMAP_ENTRY _entries[] = { 
    //              DEBUG_QI_ENTRY(x)
    //

    BEGIN_COM_MAP(CATLSimpleObject)

    //
    //              {&_ATL_IIDOF(x), offsetofclass(x, _ComMapClass),  _ATL_SIMPLEMAPENTRY},
    //

        COM_INTERFACE_ENTRY(IATLSimpleObject)
        COM_INTERFACE_ENTRY(IDispatch)

    //
    //              __if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }
    //              {NULL, 0, 0}
    //          }; 
    //          return &_entries[1];
    //      } 
    //
    //   virtual ULONG STDMETHODCALLTYPE AddRef(void) throw() = 0; 
    //   virtual ULONG STDMETHODCALLTYPE Release(void) throw() = 0; 
    //   STDMETHOD(QueryInterface)(REFIID, _COM_Outptr_ void**) throw() = 0;
    //

    END_COM_MAP()

    //
    //  void InternalFinalConstructAddRef() {InternalAddRef();}
	//  void InternalFinalConstructRelease() {InternalRelease();}
    //

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

public:
    STDMETHOD(Test)();
};

OBJECT_ENTRY_AUTO(__uuidof(ATLSimpleObject), CATLSimpleObject)
